home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / emulator / uae-0.000 / uae-0 / uae-0.6.0 / svga.c < prev    next >
C/C++ Source or Header  |  1996-05-04  |  11KB  |  461 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * SVGAlib interface.
  5.   * 
  6.   * (c) 1995 Bernd Schmidt
  7.   */
  8.  
  9. #include "sysconfig.h"
  10. #include "sysdeps.h"
  11.  
  12. #include <assert.h>
  13. #include <signal.h>
  14. #include <vga.h>
  15. #include <vgamouse.h>
  16. #include <vgakeyboard.h>
  17.  
  18. #include "config.h"
  19. #include "options.h"
  20. #include "memory.h"
  21. #include "custom.h"
  22. #include "newcpu.h"
  23. #include "keyboard.h"
  24. #include "xwin.h"
  25. #include "keybuf.h"
  26.  
  27. #define SCODE_CURSORBLOCKUP    103    /* Cursor key block. */
  28. #define SCODE_CURSORBLOCKLEFT 105
  29. #define SCODE_CURSORBLOCKRIGHT 106
  30. #define SCODE_CURSORBLOCKDOWN 108
  31.  
  32. #define SCODE_INSERT 110
  33. #define SCODE_HOME 102
  34. #define SCODE_PGUP 104
  35. #define SCODE_DELETE 111
  36. #define SCODE_END 107
  37. #define SCODE_PGDN 109
  38.  
  39. #define SCODE_KEYPAD0    82
  40. #define SCODE_KEYPAD1    79
  41. #define SCODE_KEYPAD2    80
  42. #define SCODE_KEYPAD3    81
  43. #define SCODE_KEYPAD4    75
  44. #define SCODE_KEYPAD5    76
  45. #define SCODE_KEYPAD6    77
  46. #define SCODE_KEYPAD7    71
  47. #define SCODE_KEYPAD8    72
  48. #define SCODE_KEYPAD9    73
  49. #define SCODE_KEYPADENTER    96
  50. #define SCODE_KEYPADPLUS    78
  51. #define SCODE_KEYPADMINUS    74
  52.  
  53. #define SCODE_Q        16
  54. #define SCODE_W        17
  55. #define SCODE_E        18
  56. #define SCODE_R        19
  57. #define SCODE_T        20
  58. #define SCODE_Y        21
  59. #define SCODE_U        22
  60. #define SCODE_I        23
  61. #define SCODE_O        24
  62. #define SCODE_P        25
  63.  
  64. #define SCODE_A        30
  65. #define SCODE_S        31
  66. #define SCODE_D        32
  67. #define SCODE_F        33
  68. #define SCODE_G        34
  69. #define SCODE_H        35
  70. #define SCODE_J        36
  71. #define SCODE_K        37
  72. #define SCODE_L        38
  73.  
  74. #define SCODE_Z        44
  75. #define SCODE_X        45
  76. #define SCODE_C        46
  77. #define SCODE_V        47
  78. #define SCODE_B        48
  79. #define SCODE_N        49
  80. #define SCODE_M        50
  81.  
  82. #define SCODE_ESCAPE        1
  83. #define SCODE_ENTER        28
  84. #define SCODE_RIGHTCONTROL    97
  85. #define SCODE_CONTROL    97
  86. #define SCODE_RIGHTALT    100
  87. #define SCODE_LEFTCONTROL    29
  88. #define SCODE_LEFTALT    56
  89. #define SCODE_SPACE        57
  90.  
  91. #define SCODE_F1        59
  92. #define SCODE_F2        60
  93. #define SCODE_F3        61
  94. #define SCODE_F4        62
  95. #define SCODE_F5        63
  96. #define SCODE_F6        64
  97. #define SCODE_F7        65
  98. #define SCODE_F8        66
  99. #define SCODE_F9        67
  100. #define SCODE_F10        68
  101.  
  102. #define SCODE_0 11
  103. #define SCODE_1 2
  104. #define SCODE_2 3
  105. #define SCODE_3 4
  106. #define SCODE_4 5 
  107. #define SCODE_5 6
  108. #define SCODE_6 7 
  109. #define SCODE_7 8
  110. #define SCODE_8 9
  111. #define SCODE_9 10
  112.  
  113. #define SCODE_LEFTSHIFT 42
  114. #define SCODE_RIGHTSHIFT 54
  115. #define SCODE_TAB 15
  116.  
  117. #define SCODE_F11 87
  118. #define SCODE_F12 88
  119. #define SCODE_NEXT 81
  120. #define SCODE_PRIOR 73
  121. #define SCODE_BS 14
  122. /*
  123. #define SCODE_asciicircum 1
  124. */
  125. #define SCODE_bracketleft 26
  126. #define SCODE_bracketright 27
  127. #define SCODE_comma 51
  128. #define SCODE_period 52
  129. #define SCODE_slash 53
  130. #define SCODE_semicolon 39
  131. #define SCODE_grave 40
  132. #define SCODE_minus 12
  133. #define SCODE_equal 13
  134. #define SCODE_numbersign 41
  135. #define SCODE_ltgt 43
  136. #define SCODE_scrolllock 70
  137.  
  138. #define SCODE_LWIN95 125
  139. #define SCODE_RWIN95 126
  140. #define SCODE_MWIN95 127
  141.  
  142. static int vsize;
  143. static vga_modeinfo modeinfo;
  144. static char *linear_mem = NULL;
  145. xcolnr xcolors[4096];
  146.  
  147. struct vidbuf_description gfxvidinfo;
  148.  
  149. void flush_line(int y)
  150. {
  151.     int target_y = y;
  152.     
  153.     if (screen_res < 2)
  154.     target_y -= 8;
  155.     if (linear_mem == NULL) {
  156.     char *addr = gfxvidinfo.bufmem + y*gfxvidinfo.rowbytes;
  157.     if (use_lores) {
  158.         addr += gfxvidinfo.pixbytes * (prev_max_diwstop - 328);
  159.     }
  160.     if (target_y < modeinfo.height && target_y >= 0)
  161.         vga_drawscanline(target_y, addr);
  162.     }
  163. }
  164.  
  165. void flush_block(int a, int b)
  166. {
  167.     abort();
  168. }
  169.  
  170. void flush_screen(int a, int b)
  171. {
  172. }
  173.  
  174. static int colors_allocated;
  175.  
  176. static int get_color(int r, int g, int b, xcolnr *cnp)
  177. {
  178.     if (colors_allocated == 256)
  179.     return -1;
  180.     *cnp = colors_allocated;
  181.     vga_setpalette(colors_allocated, doMask(r, 6, 0), doMask(g, 6, 0), doMask(b, 6, 0));
  182.     colors_allocated++;
  183.     return 1;
  184. }
  185.  
  186. static void init_colors(void)
  187. {
  188.     int rw = 5, gw = 5, bw = 5;
  189.     colors_allocated = 0;
  190.     if (color_mode == 2) gw = 6;
  191.     
  192.     if (gfxvidinfo.pixbytes == 2)
  193.     alloc_colors64k(rw, gw, bw, gw+bw, bw, 0);
  194.     else
  195.     alloc_colors256(get_color);
  196. }
  197.  
  198. int buttonstate[3] = { 0, 0, 0 };
  199. int lastmx, lastmy;
  200. int newmousecounters = 0;
  201.  
  202. static int keystate[256];
  203.  
  204. static int scancode2amiga(int scancode)
  205. {
  206.     switch(scancode) {
  207.      case SCODE_A: return AK_A;
  208.      case SCODE_B: return AK_B;
  209.      case SCODE_C: return AK_C;
  210.      case SCODE_D: return AK_D;
  211.      case SCODE_E: return AK_E;
  212.      case SCODE_F: return AK_F;
  213.      case SCODE_G: return AK_G;
  214.      case SCODE_H: return AK_H;
  215.      case SCODE_I: return AK_I;
  216.      case SCODE_J: return AK_J;
  217.      case SCODE_K: return AK_K;
  218.      case SCODE_L: return AK_L;
  219.      case SCODE_M: return AK_M;
  220.      case SCODE_N: return AK_N;
  221.      case SCODE_O: return AK_O;
  222.      case SCODE_P: return AK_P;
  223.      case SCODE_Q: return AK_Q;
  224.      case SCODE_R: return AK_R;
  225.      case SCODE_S: return AK_S;
  226.      case SCODE_T: return AK_T;
  227.      case SCODE_U: return AK_U;
  228.      case SCODE_V: return AK_V;
  229.      case SCODE_W: return AK_W;
  230.      case SCODE_X: return AK_X;
  231.      case SCODE_Y: return AK_Y;
  232.      case SCODE_Z: return AK_Z;
  233.     
  234.      case SCODE_0: return AK_0;
  235.      case SCODE_1: return AK_1;
  236.      case SCODE_2: return AK_2;
  237.      case SCODE_3: return AK_3;
  238.      case SCODE_4: return AK_4;
  239.      case SCODE_5: return AK_5;
  240.      case SCODE_6: return AK_6;
  241.      case SCODE_7: return AK_7;
  242.      case SCODE_8: return AK_8;
  243.      case SCODE_9: return AK_9;
  244.     
  245.      case SCODE_KEYPAD0: return AK_NP0;
  246.      case SCODE_KEYPAD1: return AK_NP1;
  247.      case SCODE_KEYPAD2: return AK_NP2;
  248.      case SCODE_KEYPAD3: return AK_NP3;
  249.      case SCODE_KEYPAD4: return AK_NP4;
  250.      case SCODE_KEYPAD5: return AK_NP5;
  251.      case SCODE_KEYPAD6: return AK_NP6;
  252.      case SCODE_KEYPAD7: return AK_NP7;
  253.      case SCODE_KEYPAD8: return AK_NP8;
  254.      case SCODE_KEYPAD9: return AK_NP9;
  255.     
  256.      case SCODE_F1: return AK_F1;
  257.      case SCODE_F2: return AK_F2;
  258.      case SCODE_F3: return AK_F3;
  259.      case SCODE_F4: return AK_F4;
  260.      case SCODE_F5: return AK_F5;
  261.      case SCODE_F6: return AK_F6;
  262.      case SCODE_F7: return AK_F7;
  263.      case SCODE_F8: return AK_F8;
  264.      case SCODE_F9: return AK_F9;
  265.      case SCODE_F10: return AK_F10;
  266.     
  267.      case SCODE_BS: return AK_BS;
  268.      case SCODE_LEFTCONTROL: return AK_CTRL;
  269.      case SCODE_RIGHTCONTROL: return AK_CTRL;
  270.      case SCODE_TAB: return AK_TAB;
  271.      case SCODE_LEFTALT: return AK_LALT;
  272.      case SCODE_RIGHTALT: return AK_RALT;
  273.      case SCODE_ENTER: return AK_RET;
  274.      case SCODE_SPACE: return AK_SPC;
  275.      case SCODE_LEFTSHIFT: return AK_LSH;
  276.      case SCODE_RIGHTSHIFT: return AK_RSH;
  277.      case SCODE_ESCAPE: return AK_ESC;
  278.     
  279.      case SCODE_INSERT:
  280.      case SCODE_END:    
  281.      case SCODE_HOME: break;
  282.  
  283.      case SCODE_DELETE: return AK_DEL;
  284.      case SCODE_CURSORBLOCKUP: return AK_UP;
  285.      case SCODE_CURSORBLOCKDOWN: return AK_DN;
  286.      case SCODE_CURSORBLOCKLEFT: return AK_LF;
  287.      case SCODE_CURSORBLOCKRIGHT: return AK_RT;
  288.     
  289.      case SCODE_F11: return AK_BACKSLASH;
  290. /*
  291.      case SCODE_asciicircum: return AK_00;
  292.  */
  293.      case SCODE_bracketleft: return AK_LBRACKET;
  294.      case SCODE_bracketright: return AK_RBRACKET;
  295.      case SCODE_comma: return AK_COMMA;
  296.      case SCODE_period: return AK_PERIOD;
  297.      case SCODE_slash: return AK_SLASH;
  298.      case SCODE_semicolon: return AK_SEMICOLON;
  299.      case SCODE_grave: return AK_QUOTE;
  300.      case SCODE_minus: return AK_MINUS;
  301.      case SCODE_equal: return AK_EQUAL;
  302.     
  303.     /* This one turns off screen updates. */
  304.      case SCODE_scrolllock: return AK_inhibit;
  305.  
  306.      case SCODE_PGUP: case SCODE_RWIN95: return AK_RAMI;
  307.      case SCODE_PGDN: case SCODE_LWIN95: return AK_LAMI; 
  308.     
  309. /*#ifdef KBD_LANG_DE*/
  310.      case SCODE_numbersign: return AK_NUMBERSIGN;
  311.      case SCODE_ltgt: return AK_LTGT;
  312. /*#endif*/
  313.     }
  314.     return -1;
  315. }
  316.  
  317. static void my_kbd_handler(int scancode, int newstate)
  318. {
  319.     int akey = scancode2amiga(scancode);
  320.     
  321.     assert(scancode >= 0 && scancode < 0x100);
  322.     if (scancode == SCODE_F12)
  323.         specialflags |= SPCFLAG_BRK;
  324.     if (keystate[scancode] == newstate)
  325.         return;
  326.     keystate[scancode] = newstate;
  327.  
  328.     if (akey == -1)
  329.         return;
  330.  
  331.     if (newstate == KEY_EVENTPRESS) {
  332.     if (akey == AK_inhibit)
  333.         inhibit_frame ^= 1;
  334.     else
  335.         record_key (akey << 1);
  336.     } else
  337.         record_key ((akey << 1) | 1);
  338.     
  339.     /* "Affengriff" */
  340.     if(keystate[AK_CTRL] && keystate[AK_LAMI] && keystate[AK_RAMI])
  341.         MC68000_reset();
  342. }
  343.  
  344. int graphics_init(void)
  345. {
  346.     int i;
  347.     int vgamode;
  348.     if ((screen_res == 1 || screen_res == 2) && color_mode != 0) {
  349.     fprintf(stderr, "Sorry, this combination of color and video mode is not supported.\n");
  350.     return 0;
  351.     }
  352.     switch (screen_res) {
  353.      case 0: vgamode = (color_mode == 0 ? G320x200x256 
  354.             : color_mode == 1 ? G320x200x32K 
  355.             : G320x200x64K);
  356.         break;
  357.      case 1: vgamode = G320x240x256; break;
  358.      case 2: vgamode = G320x400x256; break;
  359.      case 3: 
  360.      case 4: vgamode = (color_mode == 0 ? G800x600x256 
  361.             : color_mode == 1 ? G800x600x32K 
  362.             : G800x600x64K);
  363.     break;
  364.      default:
  365.     printf("Invalid screen mode.\n");
  366.     return 0;
  367.     }
  368.     vga_init();
  369.     modeinfo = *vga_getmodeinfo (vgamode);
  370.     if (modeinfo.bytesperpixel == 0) {
  371.     printf("Got a bogus value from SVGAlib... %s.\n",
  372.            screen_res == 1 || screen_res == 2 ? "trying to fix it" : "giving up");
  373.     if (screen_res != 1 && screen_res != 2)
  374.         return 0;
  375.     modeinfo.bytesperpixel = 1;
  376.     modeinfo.linewidth = 320;
  377.     }
  378.     gfxvidinfo.pixbytes = modeinfo.bytesperpixel;
  379.     if (vga_setmode(vgamode) < 0) {
  380.     sleep(1);
  381.     vga_setmode(TEXT);
  382.     fprintf(stderr, "SVGAlib doesn't like my video mode. Giving up.\n");
  383.     return 0;
  384.     }
  385.     
  386.     if ((modeinfo.flags & CAPABLE_LINEAR) && !use_lores && !use_xhair) {
  387.     if (vga_setlinearaddressing() != -1) {
  388.         linear_mem = (char *)vga_getgraphmem();
  389.         printf("Using linear addressing: %p.\n", linear_mem);
  390.     }
  391.     }
  392.     
  393.     vsize = dont_want_aspect ? numscrlines : 2*numscrlines;
  394.     gfxvidinfo.maxblocklines = 0;
  395. /*    printf("%d %d %d\n", modeinfo.linewidth, modeinfo.bytesperpixel, modeinfo.maxpixels);*/
  396.     if (linear_mem) {
  397.     gfxvidinfo.bufmem = linear_mem;
  398.     gfxvidinfo.rowbytes = modeinfo.linewidth;
  399.     } else {
  400.     gfxvidinfo.rowbytes = 800 * gfxvidinfo.pixbytes;
  401.     gfxvidinfo.bufmem = malloc(gfxvidinfo.rowbytes * vsize);
  402.     memset(gfxvidinfo.bufmem, 0, gfxvidinfo.rowbytes * vsize);
  403.     }
  404.     init_colors();
  405.     vga_setmousesupport(1);
  406.     mouse_init("/dev/mouse",vga_getmousetype(),10);
  407.     if (keyboard_init() != 0)
  408.         abort();
  409.     keyboard_seteventhandler(my_kbd_handler);
  410.     keyboard_translatekeys(DONT_CATCH_CTRLC);
  411.     
  412.     buttonstate[0] = buttonstate[1] = buttonstate[2] = 0;
  413.     for(i = 0; i < 256; i++) 
  414.     keystate[i] = 0;
  415.  
  416.     lastmx = lastmy = 0;
  417.     newmousecounters = 0;
  418.  
  419.     mouse_setxrange(-1000,1000);
  420.     mouse_setyrange(-1000,1000);
  421.     mouse_setposition(0,0);
  422.     
  423.     return 1;
  424. }
  425.  
  426. void graphics_leave(void)
  427. {
  428.     sleep(1); /* Maybe this will fix the "screen full of garbage" problem */
  429.     vga_setmode(TEXT);
  430.     keyboard_close();
  431. }
  432.  
  433. void handle_events(void)
  434. {
  435.     int button = mouse_getbutton();
  436.     
  437.     keyboard_update();
  438.     mouse_update();
  439.     lastmx += mouse_getx();
  440.     lastmy += mouse_gety();
  441.     mouse_setposition(0,0);
  442.  
  443.     buttonstate[0] = button & 4;
  444.     buttonstate[1] = button & 2;
  445.     buttonstate[2] = button & 1;
  446. }
  447.  
  448. int debuggable(void)
  449. {
  450.     return 0;
  451. }
  452.  
  453. int needmousehack(void)
  454. {
  455.     return 0;
  456. }
  457.  
  458. void LED(int on)
  459. {
  460. }
  461.